home *** CD-ROM | disk | FTP | other *** search
/ Power Tools for Macintosh / Power Tools for Macintosh (SoftBit)(1992).iso / Stacks / *F-I / HyperCard Utilities / Videodisc⁄Drivers ƒ / HitachiVideo.p < prev    next >
Encoding:
Text File  |  1986-11-11  |  7.0 KB  |  296 lines  |  [TEXT/MPS ]

  1. {$R-}
  2. {$D+}
  3. (*
  4.     HitachiVideo -- a WildCard user-defined command to drive a laser disc player.
  5.  
  6.     To compile and link this file using Macintosh Programmer's Workshop,
  7.  
  8.     pascal HitachiVideo.p
  9.     link -o WildCommands -sn Main=HitachiVideo -sn STDIO=HitachiVideo ∂
  10.          -sn INTENV=HitachiVideo -rt WCMD=2 ∂
  11.          HitachiVideo.p.o {MPW}libraries:interface.o
  12.  
  13.     then use ResEdit to copy the resulting WCMD from WildCommands
  14.     and paste it into WildCard, the Home stack, or your own stack.
  15.     (WCMD=1 Panasonic, =2 Hitachi, =3 Phillips, =4 PioneerLDV6000)
  16. *)
  17.  
  18. UNIT DummyUnit;
  19.  
  20. INTERFACE
  21.  
  22.    USES MemTypes, QuickDraw, OsIntf;
  23.     
  24. IMPLEMENTATION
  25.  
  26. PROCEDURE Hitachi(commandPtr: Ptr);                            FORWARD;
  27.  
  28.    PROCEDURE EntryPoint(arg: Ptr);
  29.    { entry point cannot have local procs, but forward routines can }
  30.    BEGIN
  31.      Hitachi(arg);
  32.    END;
  33.  
  34.    PROCEDURE Hitachi(commandPtr: Ptr);
  35.    VAR reverseFlag, offFlag, tillFlag: BOOLEAN;
  36.        message, tempStr: Str255;
  37.        refNum: INTEGER;
  38.        err: INTEGER;
  39.             
  40.      PROCEDURE OpenSerial;
  41.      VAR handShake: SerShk;
  42.          baudRate: INTEGER;
  43.      BEGIN
  44.        baudRate := 9600;
  45.        { for now, use modem port so we don't mess with AppleTalk }
  46.        err := FSOpen('.AOUT',0,refNum);
  47.        IF err = 0 THEN 
  48.          BEGIN
  49.            WITH handShake DO
  50.              BEGIN
  51.                fXon := 1;
  52.                fCTS := 1;
  53.                xon  := CHR(17);
  54.                xoff := CHR(19);
  55.                errs := 0;
  56.                evts := 0;
  57.                fInx := 0;
  58.              END;
  59.            err := SerHShake(refNum,handShake);
  60.            IF err = 0 THEN 
  61.              err := Control(refNum,13,@baudRate);
  62.          END;
  63.      END;
  64.      
  65.      
  66.      PROCEDURE CloseSerial;
  67.      BEGIN
  68.        err := FSClose(refNum);
  69.      END;
  70.      
  71.      
  72.      PROCEDURE SendCommand(cmd: Str255);
  73.      VAR count: LongInt;
  74.      BEGIN
  75.        count := Length(cmd);
  76.        err := FSWrite(refNum, count, Pointer(Ord(@cmd)+1));
  77.      END;
  78.      
  79.      FUNCTION Concat(str1, str2, str3: Str255): Str255;
  80.      VAR result: Str255;
  81.          resultLen: INTEGER;
  82.          charNum: INTEGER;
  83.      BEGIN
  84.        result := '';
  85.        resultLen := 0;
  86.        FOR charNum := 1 TO Length(str1) DO
  87.          BEGIN
  88.            resultLen := resultLen + 1;
  89.            result[resultLen] := str1[charNum];
  90.          END;
  91.        FOR charNum := 1 TO Length(str2) DO
  92.          BEGIN
  93.            resultLen := resultLen + 1;
  94.            result[resultLen] := str2[charNum];
  95.          END;
  96.        FOR charNum := 1 TO Length(str3) DO
  97.          BEGIN
  98.            resultLen := resultLen + 1;
  99.            result[resultLen] := str3[charNum];
  100.          END;
  101.       result[0] := CHR(resultLen);
  102.       Concat := result;
  103.      END;
  104.      
  105.      
  106.      PROCEDURE GetMessage;     
  107.      VAR charNum: INTEGER;
  108.          msgChar: CHAR;
  109.      BEGIN
  110.        { skip command name }
  111.        WHILE (commandPtr^ <> 0) AND (commandPtr^ <> 13) AND (CHR(commandPtr^) <> ' ') DO
  112.          commandPtr := Pointer(Ord(commandPtr)+1);
  113.          
  114.        { skip following white space }
  115.        WHILE CHR(commandPtr^) = ' ' DO 
  116.          commandPtr := Pointer(Ord(commandPtr)+1);
  117.          
  118.        { extract the rest into a Str255 }
  119.        charNum := 0;
  120.        WHILE (commandPtr^ <> 0) AND (charNum < 255) DO
  121.          BEGIN
  122.            msgChar := CHR(commandPtr^);
  123.            commandPtr := Pointer(Ord(commandPtr)+1);
  124.            charNum := charNum + 1;
  125.            IF (ORD(msgChar) >= ORD('A')) AND (ORD(msgChar) <= ORD('Z')) THEN
  126.              message[charNum] := CHR(ORD('a') + (ORD(msgChar) - ORD('A')))
  127.            ELSE message[charNum] := msgChar;
  128.          END;
  129.        message[0] := CHR(charNum);
  130.      END;
  131.      
  132.        
  133.      FUNCTION Contains(target: Str255): BOOLEAN;
  134.      VAR offset: INTEGER;     
  135.      
  136.        FUNCTION Match: BOOLEAN;
  137.        VAR index: INTEGER;
  138.        BEGIN
  139.          Match := TRUE;
  140.          FOR index := 1 TO Length(target) DO
  141.            IF offset + index > Length(message) THEN 
  142.              BEGIN
  143.                Match := FALSE;  { ran off the end }
  144.                EXIT(Match);
  145.              END
  146.            ELSE IF target[index] <> message[offset+index] THEN
  147.              BEGIN
  148.                Match := FALSE;  { hit a wrong char }
  149.                EXIT(Match);
  150.              END;
  151.        END;
  152.        
  153.      BEGIN
  154.        Contains := FALSE;
  155.        FOR offset := 0 TO Length(message) - 1 DO
  156.          IF Match THEN
  157.            BEGIN
  158.              Contains := TRUE;
  159.              EXIT(Contains);
  160.            END;
  161.      END;
  162.      
  163.      
  164.      FUNCTION GetDigit(digit: CHAR): Str255;
  165.      BEGIN
  166.        CASE digit OF
  167.          '0': GetDigit := '0'; { this is doing a type conversion }
  168.          '1': GetDigit := '1'; { from CHAR to Str255 }
  169.          '2': GetDigit := '2';
  170.          '3': GetDigit := '3';
  171.          '4': GetDigit := '4';
  172.          '5': GetDigit := '5';
  173.          '6': GetDigit := '6';
  174.          '7': GetDigit := '7';
  175.          '8': GetDigit := '8';
  176.          '9': GetDigit := '9';
  177.        END;
  178.      END;
  179.   
  180.   
  181.      FUNCTION GetInteger(which: INTEGER): Str255;
  182.      { get the Nth integer in Hitachi format }
  183.      VAR digitLoc, charVal:    INTEGER;
  184.          intStr:            Str255;
  185.          nowReading:        INTEGER;
  186.          inNumber:            BOOLEAN;
  187.      BEGIN
  188.        intStr := '';
  189.        nowReading := 0;
  190.        inNumber := FALSE;
  191.        FOR digitLoc := 1 TO Length(message) DO
  192.          BEGIN
  193.            charVal := ORD(message[digitLoc]);
  194.            IF which <> nowReading THEN
  195.              BEGIN
  196.                IF (NOT inNumber) AND ((charVal >= ORD('0')) AND (charVal <= ORD('9'))) THEN
  197.                  BEGIN
  198.                    nowReading := nowReading + 1;
  199.                    inNumber := TRUE;
  200.                  END;
  201.                IF (inNumber) AND ((charVal < ORD('0')) OR (charVal > ORD('9'))) THEN
  202.                  inNumber := FALSE;
  203.              END;
  204.            IF nowReading = which THEN
  205.              BEGIN
  206.                {collect our number}
  207.                IF (charVal >= ORD('0')) AND (charVal <= ORD('9')) THEN
  208.                  intStr := Concat(intStr, GetDigit(message[digitLoc]), '');
  209.              END;
  210.          END;
  211.        GetInteger := intStr;
  212.        IF Length(intStr) = 0 THEN SysBeep(1);  {warning that right number was not found}
  213.      END;
  214.  
  215.    BEGIN
  216.      OpenSerial;
  217.      IF err <> 0 THEN 
  218.        BEGIN
  219.          SysBeep(1);
  220.          EXIT(Hitachi);
  221.        END;
  222.      
  223.      GetMessage;
  224.      
  225.      { set flags }
  226.      reverseFlag := Contains('rev');
  227.      offFlag := Contains('off');
  228.      tillFlag := Contains('till');
  229.      
  230.      IF Contains('stop') THEN SendCommand('*')
  231.      ELSE IF Contains('init') THEN SendCommand('h')
  232.      ELSE IF Contains('eject') THEN SendCommand('\')
  233.      ELSE IF Contains('search') THEN SendCommand(Concat('+:', GetInteger(1), 'A'))
  234.      ELSE IF Contains('play') THEN
  235.        BEGIN
  236.          IF tillFlag THEN 
  237.            BEGIN
  238.              tempStr := Concat('+:', GetInteger(1), '$');
  239.              tempStr := Concat(tempStr, GetInteger(2), 'AA');
  240.              tempStr[Length(tempStr)] := CHR(13);  { cr at end }
  241.              SendCommand(tempStr)
  242.              { Video Play 12345 till 12400  -- this is the proper format }
  243.            END
  244.          ELSE IF reverseFlag THEN SendCommand('B')
  245.          ELSE SendCommand('%'); { normal play forward }
  246.        END
  247.      ELSE IF Contains('step') THEN
  248.        BEGIN
  249.          IF reverseFlag THEN SendCommand(')')
  250.          ELSE SendCommand('$')
  251.        END
  252.        
  253.      ELSE IF Contains('slow') THEN
  254.        BEGIN
  255.          IF reverseFlag THEN SendCommand('(')
  256.          ELSE SendCommand('#')
  257.        END
  258.      ELSE IF Contains('fast') THEN
  259.        BEGIN
  260.          IF reverseFlag THEN SendCommand('&')
  261.          ELSE SendCommand('!')
  262.        END
  263.      ELSE IF Contains('scan') THEN
  264.        BEGIN
  265.          IF reverseFlag THEN SendCommand('''')
  266.          ELSE SendCommand('"')
  267.        END
  268.      ELSE IF Contains('picture') THEN
  269.        BEGIN
  270.          IF offFlag THEN SendCommand('o')
  271.          ELSE SendCommand('n')
  272.        END
  273.      ELSE IF Contains('frame') THEN
  274.        BEGIN
  275.          IF offFlag THEN SendCommand('M')
  276.          ELSE SendCommand('L')
  277.        END
  278.      ELSE IF Contains('sound') THEN 
  279.        BEGIN
  280.          IF Contains('1') THEN
  281.            IF offFlag THEN SendCommand('I')
  282.            ELSE SendCommand('H')
  283.          ELSE IF Contains('2') THEN
  284.            IF offFlag THEN SendCommand('K')
  285.            ELSE SendCommand('J')
  286.          ELSE SysBeep(1);
  287.        END
  288.      ELSE SysBeep(1); { unknown command }
  289.      CloseSerial;
  290.    END;   
  291.  
  292. END.
  293.  
  294.  
  295.  
  296.